package com.hy.controller;

import com.hy.base.BaseInfoProperties;
import com.hy.grace.result.GraceJSONResult;
import com.hy.grace.result.ResponseStatusEnum;
import com.hy.pojo.Candidate;
import com.hy.pojo.bo.VerifySMSBO;
import com.hy.pojo.vo.CandidateVO;
import com.hy.service.CandidateService;
import com.hy.service.InterviewRecordService;
import com.hy.utils.JsonUtils;
import com.hy.utils.SMSUtils;
import jakarta.validation.Valid;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import java.util.UUID;

/**
 * 登录
 */
@RestController
@RequestMapping("/welcome")
public class WelcomeController extends BaseInfoProperties {

    @Autowired
    private SMSUtils smsUtils;

    @Autowired
    private CandidateService candidateService;

    @Autowired
    private InterviewRecordService interviewRecordService;

    /**
     * 获取验证码
     * @param mobile
     * @return
     */
    @PostMapping("getSMSCode")
    public GraceJSONResult getSMSCode(@RequestParam String mobile) throws Exception {

        if (StringUtils.isBlank(mobile)) return GraceJSONResult.error();

        String code = String.format("%06d",(int)(Math.random() * 100000));

        // 调用api获取验证码，当前无法调用，换另一种方法
        //smsUtils.sendSMS(mobile, code);
        System.out.println("验证码：" + code);

        // 验证码存入redis中，设置过期时间5分钟
        redis.set(MOBILE_SMSCODE + ":" + mobile, code,5 * 60);

        return GraceJSONResult.ok();
    }

    /**
     * 验证码校验
     * @param verifySMSBO
     * @return
     */
    @PostMapping("verify")
    public GraceJSONResult verify(@Validated @RequestBody VerifySMSBO verifySMSBO) {
        String mobile = verifySMSBO.getMobile();
        String code = verifySMSBO.getSmsCode();

        // 1. 从redis获取验证码校验判断是否匹配
        String redisCode = redis.get(MOBILE_SMSCODE + ":" + mobile);
            // equalsIgnoreCase 判断字符串是否相等
        if (StringUtils.isBlank(redisCode) || !redisCode.equalsIgnoreCase(code)) {
            return GraceJSONResult.errorCustom(ResponseStatusEnum.SMS_CODE_ERROR);
        }

        // 2. 根据手机号查询数据库，判断用户是否存在（是否为候选人）
        Candidate candidate = candidateService.queryByMobileIsExist(mobile);
        if (candidate == null) {
            // 2.1 如果查询的用户为空，表示该用户不是候选人，不能进入面试流程
            return GraceJSONResult.errorCustom(ResponseStatusEnum.USER_INFO_NOT_EXIST_ERROR);
        }else{
            // 2.2 如果查询的用户不为空，需判断该用户是否已经完成面试，若完成面试，则无法再面试
            boolean isExist = interviewRecordService.isCandidateRecordExist(candidate.getId());
            if (isExist) {
                return GraceJSONResult.errorCustom(ResponseStatusEnum.USER_ALREADY_DID_INTERVIEW_ERROR);
            }
        }

        // 3.保存用户token信息，保存分布式会话到redis中
        String uToken = UUID.randomUUID().toString();
        redis.set(REDIS_USER_TOKEN + ":" + candidate.getId(),uToken, 3 * 60 * 60);

        CandidateVO candidateVO = new CandidateVO();
        BeanUtils.copyProperties(candidate, candidateVO);
        candidateVO.setCandidateId(candidate.getId());
        candidateVO.setUserToken(uToken);
        // 4.用户进入面试流程后，删除redis中的验证码
        redis.del(MOBILE_SMSCODE + ":" + mobile);

        // 6.（可选）用户信息保存到服务端redis中，保留一段时间
        redis.set(REDIS_USER_INFO+ ":" + candidate.getId(), JsonUtils.objectToJson(candidateVO), 3 * 60 * 60);

        // 5.返回结果给前端
        return GraceJSONResult.ok(candidateVO);
    }
}
